package colisionDetection;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.LinkedList;
import java.util.List;
public class CollisionDetectionService {
public static final int BOARD_N_EDGE = 19;
public static final int BOARD_S_EDGE = 0;
public static final int BOARD_W_EDGE = 0;
public static final int BOARD_E_EDGE = 19;
private final ScoreEventHandler scoreEventHandler;
public CollisionDetectionService(ScoreEventHandler scoreEventHandler) {
this.scoreEventHandler = scoreEventHandler;
}
public BotPositionsMessage detectCollisions(BotPositionsMessage input) {
System.out.println("----------- received message");
System.out.println(input);
List<BotPosition> botPositions = new LinkedList<>();
MultiValueMap<Coordinates, String> playersOnPosition = new LinkedMultiValueMap<>();
for (BotPosition botPosition : input.getPositions()) {
BotPosition validBotPosition = validateInsideArena(botPosition);
botPositions.add(validBotPosition);
playersOnPosition.add(new Coordinates(validBotPosition.getCoordinates()), validBotPosition.getId());
}
BotPositionsMessage output = new BotPositionsMessage(botPositions);
// System.out.println("send message");
// System.out.println(output);
detectCollisions(playersOnPosition);
return output;
}
private void detectCollisions(MultiValueMap<Coordinates, String> playersOnPosition) {
for (List<String> players : playersOnPosition.values()) {
if (players.size() > 1) {
System.out.println("------ players "+players+" collided");
for (String player : players) {
scoreEventHandler.handleScoreEvent(player);
}
}
}
}
private BotPosition validateInsideArena(BotPosition botPosition) {
int validatedX = botPosition.getCoordinates()[0];
int validatedY = botPosition.getCoordinates()[1];
if (validatedX < BOARD_W_EDGE) {
validatedX = BOARD_W_EDGE;
} else if (validatedX > BOARD_E_EDGE) {
validatedX = BOARD_E_EDGE;
}
if (validatedY < BOARD_S_EDGE) {
validatedY = BOARD_S_EDGE;
} else if (validatedY > BOARD_N_EDGE) {
validatedY = BOARD_N_EDGE;
}
return new BotPosition(botPosition.getId(), validatedX, validatedY);
}
}